function _selectToolbar(name, fn) {
  var self = this,
    knode = self.get(name);
  if (knode) {
    if (knode.hasClass("ke-disabled")) {
      return;
    }
    fn(knode);
  }
}

// create KToolbar class
function KToolbar(options) {
  this.init(options);
}
_extend(KToolbar, KWidget, {
  init: function(options) {
    var self = this;
    KToolbar.parent.init.call(self, options);
    self.disableMode = _undef(options.disableMode, false);
    self.noDisableItemMap = _toMap(_undef(options.noDisableItems, []));
    self._itemMap = {};
    self.div
      .addClass("ke-toolbar")
      .bind("contextmenu,mousedown,mousemove", function(e) {
        e.preventDefault();
      })
      .attr("unselectable", "on");
    function find(target) {
      var knode = K(target);
      if (knode.hasClass("ke-outline")) {
        return knode;
      }
      if (knode.hasClass("ke-toolbar-icon")) {
        return knode.parent();
      }
    }
    function hover(e, method) {
      var knode = find(e.target);
      if (knode) {
        if (knode.hasClass("ke-disabled")) {
          return;
        }
        if (knode.hasClass("ke-selected")) {
          return;
        }
        knode[method]("ke-on");
      }
    }
    self.div
      .mouseover(function(e) {
        hover(e, "addClass");
      })
      .mouseout(function(e) {
        hover(e, "removeClass");
      })
      .click(function(e) {
        var knode = find(e.target);
        if (knode) {
          if (knode.hasClass("ke-disabled")) {
            return;
          }
          self.options.click.call(this, e, knode.attr("data-name"));
        }
      });
  },
  get: function(name) {
    // cache
    if (this._itemMap[name]) {
      return this._itemMap[name];
    }
    return (this._itemMap[name] = K("span.ke-icon-" + name, this.div).parent());
  },
  select: function(name) {
    _selectToolbar.call(this, name, function(knode) {
      knode.addClass("ke-selected");
    });
    return self;
  },
  unselect: function(name) {
    _selectToolbar.call(this, name, function(knode) {
      knode.removeClass("ke-selected").removeClass("ke-on");
    });
    return self;
  },
  enable: function(name) {
    var self = this,
      knode = name.get ? name : self.get(name);
    if (knode) {
      knode.removeClass("ke-disabled");
      knode.opacity(1);
    }
    return self;
  },
  disable: function(name) {
    var self = this,
      knode = name.get ? name : self.get(name);
    if (knode) {
      knode.removeClass("ke-selected").addClass("ke-disabled");
      knode.opacity(0.5);
    }
    return self;
  },
  disableAll: function(bool, noDisableItems) {
    var self = this,
      map = self.noDisableItemMap,
      item;
    if (noDisableItems) {
      map = _toMap(noDisableItems);
    }
    // disable toolbar
    if (bool === undefined ? !self.disableMode : bool) {
      K("span.ke-outline", self.div).each(function() {
        var knode = K(this),
          name = knode[0].getAttribute("data-name", 2);
        if (!map[name]) {
          self.disable(knode);
        }
      });
      self.disableMode = true;
      // enable toolbar
    } else {
      K("span.ke-outline", self.div).each(function() {
        var knode = K(this),
          name = knode[0].getAttribute("data-name", 2);
        if (!map[name]) {
          self.enable(knode);
        }
      });
      self.disableMode = false;
    }
    return self;
  }
});

function _toolbar(options) {
  return new KToolbar(options);
}

K.ToolbarClass = KToolbar;
K.toolbar = _toolbar;
